package com.pai4j.remote.user;
import com.pai4j.common.bean.PAIPageResponseBeanUtil;
import com.pai4j.common.bean.PAIResponseBean;
import com.pai4j.domain.vo.request.CreateGroupRequestVO;
import com.pai4j.domain.vo.response.AccountRelationResponseVO;
import com.pai4j.domain.vo.response.UserBaseResponseInfoVO;
import com.pai4j.domain.vo.response.WaitConfirmUserResponseVO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@FeignClient(name = "pai4j-user-service", contextId = "accountRelationClient")
public interface  AccountRelationClient {

    /**
     * 订阅/关注/添加好友
     *  @  已弃用
     */
    @PostMapping("/user-service/account-relation/subscribe/{sourceAccount}/{targetAccount}")
    PAIResponseBean<Boolean> subscribe(@PathVariable String sourceAccount,
                                       @PathVariable String targetAccount);

    /**
     * 取消订阅/关注/删除好友
     *   @  已弃用
     */
    @PostMapping("/user-service/account-relation/unsubscribe/{sourceAccount}/{targetAccount}")
    PAIResponseBean<Boolean> unsubscribe(@PathVariable String sourceAccount,
                                         @PathVariable String targetAccount);
    
    /**
     * 普通关注（直接生效，无需确认）
     *
     * @param sourceAccount 关注者账号
     * @param targetAccount 被关注者账号
     * @return
     */
    @PostMapping("/user-service/account-relation/follow/{sourceAccount}/{targetAccount}")
    PAIResponseBean<Boolean> follow(@PathVariable String sourceAccount,
                                    @PathVariable String targetAccount);
    
    /**
     * 取关（仅friend表）
     *
     * @param sourceAccount 关注者账号
     * @param targetAccount 被关注者账号
     * @return
     */
    @PostMapping("/user-service/account-relation/user/unfollow/{sourceAccount}/{targetAccount}")
    PAIResponseBean<Boolean> unfollow(@PathVariable String sourceAccount,
                                      @PathVariable String targetAccount);
    
    /**
     * 是否已关注（仅friend表）
     *
     * @param sourceAccount 关注者账号
     * @param targetAccount 被关注者账号
     * @return 是否关注
     */
    @GetMapping("/user-service/account-relation/user/isFollowing/{sourceAccount}/{targetAccount}")
    PAIResponseBean<Boolean> isFollowing(@PathVariable String sourceAccount,
                                         @PathVariable String targetAccount);
    
    /**
     * 添加好友申请（需要对方确认）
     *
     * @param sourceAccount 申请者账号
     * @param targetAccount 被申请者账号
     * @return
     */
    @PostMapping("/user-service/account-relation/addFriend/{sourceAccount}/{targetAccount}")
    PAIResponseBean<Boolean> addFriend(@PathVariable String sourceAccount,
                                       @PathVariable String targetAccount);
    
    /**
     * 添加好友申请（支持推荐人信息，用于推荐卡片场景）
     *
     * @param sourceAccount 申请者账号
     * @param targetAccount 被申请者账号
     * @param recommenderAccount 推荐人账号（可选）
     * @return
     */
    @PostMapping("/user-service/account-relation/addFriendWithRecommender/{sourceAccount}/{targetAccount}")
    PAIResponseBean<Boolean> addFriendWithRecommender(@PathVariable String sourceAccount,
                                                       @PathVariable String targetAccount,
                                                       @RequestParam(value = "recommenderAccount", required = false) String recommenderAccount);

    /**
     * 同意好友关系（通过好友申请）
     * 备注为可选参数，如果提供备注则发送互动消息通知申请人
     *
     * @param confirmAccount 确认账号（审批人）
     * @param relationId 关系ID
     * @param remark 通过备注（可选，传null表示无备注）
     * @return
     */
    @PostMapping("/user-service/account-relation/confirmSubscribe")
    PAIResponseBean<Boolean> confirmSubscribe(@RequestParam("confirmAccount") String confirmAccount, 
                                              @RequestParam("relationId") Long relationId,
                                              @RequestParam(value = "remark", required = false) String remark);

    /**
     * 拒绝好友申请
     * 拒绝理由为可选参数，如果提供理由则发送互动消息通知申请人
     *
     * @param rejectAccount 拒绝账号（审批人）
     * @param relationId 关系ID
     * @param remark 拒绝理由（可选，传null表示无理由）
     * @return
     */
    @PostMapping("/user-service/account-relation/rejectSubscribe")
    PAIResponseBean<Boolean> rejectSubscribe(@RequestParam("rejectAccount") String rejectAccount, 
                                             @RequestParam("relationId") Long relationId,
                                             @RequestParam(value = "remark", required = false) String remark);

    /**
     * 分页获取账号关系列表
     *
     * @param account
     * @param type
     * @param pageNo
     * @param pageSize
     * @return
     */
    @GetMapping("/user-service/account-relation/page")
    PAIPageResponseBeanUtil<UserBaseResponseInfoVO> pageRelations(
            @RequestParam String account, @RequestParam Integer type,
            @RequestParam(name = "pageNo", required = false, defaultValue = "1") Integer pageNo,
            @RequestParam(name = "pageSize", required = false, defaultValue = "10") Integer pageSize);

    /**
     * 查询用户关注列表（用户、机器人、公众号、群组）
     * @param account
     * @return
     */
    @GetMapping("/user-service/account-relation/list/{account}")
    PAIResponseBean<AccountRelationResponseVO> listRelations(@PathVariable String account);

    /**
     * 查询待审核好友列表
     *
     * @param account
     * @return
     */
    @GetMapping("/user-service/account-relation/wait-confirm/list/{account}")
    PAIResponseBean<List<WaitConfirmUserResponseVO>> listWaitConformUsers(@PathVariable String account);

    /**
     * 创建群聊
     *
     * @param createGroupRequest
     * @return
     */
    @PostMapping("/user-service/account-relation/createGroup")
    PAIResponseBean<String> createChatGroup(@RequestBody CreateGroupRequestVO createGroupRequest);

    

    /**
     * 加入群聊（语义包装）
     *
     * @param userAccount 用户账号
     * @param groupId 群账号
     * @return 是否成功
     */
    @PostMapping("/user-service/account-relation/joinGroup/{userAccount}/{groupId}")
    PAIResponseBean<Boolean> joinGroup(@PathVariable String userAccount,
                                       @PathVariable String groupId);

    /**
     * 退出群聊（语义包装）
     *
     * @param userAccount 用户账号
     * @param groupId 群账号
     * @return 是否成功
     */
    @PostMapping("/user-service/account-relation/leaveGroup/{userAccount}/{groupId}")
    PAIResponseBean<Boolean> leaveGroup(@PathVariable String userAccount,
                                        @PathVariable String groupId);

    /**
     * 获取用户的粉丝数量（基于friend表，不再依赖account_relation表）
     * 
     * 说明：
     * - 用户对用户关系(relationType=1)：从pai4j_friend表查询，friend_id=account且status=1的记录数量
     * - 其他关系类型：仍使用pai4j_account_relation表查询
     * - 使用Redis缓存，缓存时间5分钟
     *
     * @param account 用户账号
     * @param relationType 关系类型（1=用户对用户，2=用户对群组，3=用户对专题，4=用户对机器人）
     * @return 粉丝数量
     */
    @GetMapping("/user-service/account-relation/followersCount/{account}/{relationType}")
    PAIResponseBean<Long> getFollowersCount(@PathVariable String account,
                                           @PathVariable Integer relationType);

    /**
     * 获取用户的关注数量（基于friend表，不再依赖account_relation表）
     * 
     * 说明：
     * - 用户对用户关系(relationType=1)：从pai4j_friend表查询，user_id=account且status=1的记录数量
     * - 其他关系类型：仍使用pai4j_account_relation表查询
     * - 使用Redis缓存，缓存时间5分钟
     *
     * @param account 用户账号
     * @param relationType 关系类型（1=用户对用户，2=用户对群组，3=用户对专题，4=用户对机器人）
     * @return 关注数量
     */
    @GetMapping("/user-service/account-relation/followingCount/{account}/{relationType}")
    PAIResponseBean<Long> getFollowingCount(@PathVariable String account,
                                           @PathVariable Integer relationType);

    /**
     * 获取用户的粉丝数量（默认用户对用户关系，完全基于friend表）
     * 
     * 说明：
     * - 直接从pai4j_friend表查询，friend_id=account且status=1的记录数量
     * - 使用Redis缓存，缓存key格式：FOLLOWERS_COUNT:T:1:AC:{account}
     * - 缓存时间5分钟，自动失效后重新从数据库加载
     * - 不再使用pai4j_account_relation表
     *
     * @param account 用户账号
     * @return 粉丝数量
     */
    @GetMapping("/user-service/account-relation/user/followersCount/{account}")
    PAIResponseBean<Long> getUserFollowersCount(@PathVariable String account);

    /**
     * 获取用户的关注数量（默认用户对用户关系，完全基于friend表）
     * 
     * 说明：
     * - 直接从pai4j_friend表查询，user_id=account且status=1的记录数量
     * - 使用Redis缓存，缓存key格式：FOLLOWING_COUNT:T:1:AC:{account}
     * - 缓存时间5分钟，自动失效后重新从数据库加载
     * - 不再使用pai4j_account_relation表
     *
     * @param account 用户账号
     * @return 关注数量
     */
    @GetMapping("/user-service/account-relation/user/followingCount/{account}")
    PAIResponseBean<Long> getUserFollowingCount(@PathVariable String account);
}
